#ifndef __RUNNABLE_H__
#define __RUNNABLE_H__

#include <cassert>
#include <iostream>
#include <array>

using namespace std;

class Runnable {
public:
  virtual void operator()() {
    std::cerr << "Need derived class" << endl;
    assert(false);
  }
  friend ostream &operator<<(ostream &os, Runnable &);

protected:
  // Virtual friend idiom
  virtual void print(ostream &os) {
    std::cerr << "Need derived class" << endl;
    os << "Need derived class" << endl;
    assert(false);    
  }
};
#endif // __RUNNABLE_H__
